/**
 * @Author: linzp
 * @Date: 2021/08/26/15:18
 * 设计模式-建造者模式 (生成器模式)
 */


/**
 * 1、定义Product（产品角色）： 一个具体的产品对象。(这里指 食品）
 */
class Meal {
    private String food;
    private String drink;

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public String getDrink() {
        return drink;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }
}

/**
 * 2、抽象建造者: 创建一个Product对象的各个部件指定的抽象接口。(创建 食品的组成的抽象接口）
 */
abstract class MealBuilder {

    Meal meal = new Meal();

    public abstract void buildFood();

    public abstract void buildDrink();

    public Meal getMeal(){
        return meal;
    }
}

/**
 * 3、定义ConcreteBuilder（具体建造者）： 实现抽象接口，构建和装配各个部件。（具体食品的实现类）
 */

/**
 * 具体建造者：A套餐
 */
class MealA extends MealBuilder{
    @Override
    public void buildDrink() {
        meal.setDrink("可乐");
    }

    @Override
    public void buildFood() {
        meal.setFood("薯条");
    }
}

/**
 * 具体建造者：B套餐
 */
class MealB extends MealBuilder{
    @Override
    public void buildDrink() {
        meal.setDrink("雪碧");
    }

    @Override
    public void buildFood() {
        meal.setFood("板烧鸡腿堡");
    }
}

/**
 * 4、定义Director（指挥者）： 构建一个使用Builder接口的对象。
 * 它主要是用于创建一个复杂的对象。
 * 它主要有两个作用，一是：隔离了客户与对象的生产过程，二是：负责控制产品对象的生产过程。
 */

/**
 * 指挥者：构建一个使用Builder接口的对象
 */
class KFCServer {
    private MealBuilder mealBuilder;

    public KFCServer(MealBuilder mealBuilder) { //构造方法
        this.mealBuilder = mealBuilder;
    }

    public Meal construct(){
        //准备食物
        mealBuilder.buildFood();
        //准备饮料
        mealBuilder.buildDrink();

        //准备完毕，返回一个完整的套餐给客户
        return mealBuilder.getMeal();
    }
}

public class test {
    public static void main(String[] args) {
        MealA aFood = new MealA();//创建套餐A对象
        KFCServer waitera = new KFCServer(aFood);//准备套餐A的服务员 (MealA)mealBuilder -->.buildFood().buildDrink(); --> return mealBuilder.getMeal()
        Meal mealA = waitera.construct();//获得套餐A
        System.out.print("套餐A的组成部分:");
        System.out.println("食物："+mealA.getFood()+"；   "+"饮品："+mealA.getDrink());

        MealB b = new MealB();
        KFCServer waiterb = new KFCServer(b);

        Meal mealB = waiterb.construct();
        System.out.print("套餐B的组成部分:");
        System.out.println("食物："+mealB.getFood()+"；   "+"饮品："+mealB.getDrink());



    }
}